/* This example demonstrates the usage of physics faces.
 *
 * Faces references other groups of the collection. The same group
 * can be used for many faces, but to illustrate it we are adding
 * a rectangle of different color for each face of a cube.
 * It will apply impulses on the cube when receiving messages, so
 * it's possible to see the cube rotating and moving.
 *
 * It can be tested with edje_player slave mode
 * $ edje_player -S -p -g example_group physics_3d.edj
 *
 * message 1 FLOAT_SET 3 80 -100 0 -> apply an impulse on red box with
 *    x = 50, y = -100, z = 0, for example
 * message 2 FLOAT_SET 3 0 100 0 -> apply a torque impulse on red box with
 *    x = 4, y = 0, z = 0.8, for example
 */

#define ID_IMPULSE (1)
#define ID_TORQUE_IMPULSE (2)

collections {

   group {
      name: "right";
      parts {
         part {
            name: "face";
            type: RECT;
            description {
               state: "default" 0.0;
               color: 0 0 255 255; /* blue */
            }
         }
      }
   }

   group {
      name: "left";
      parts {
         part {
            name: "face";
            type: RECT;
            description {
               state: "default" 0.0;
               color: 0 255 0 255; /* green */
            }
         }
      }
   }

   group {
      name: "front";
      parts {
         part {
            name: "face";
            type: RECT;
            description {
               state: "default" 0.0;
               color: 0 0 0 255; /* black */
            }
         }
      }
   }

   group {
      name: "back";
      parts {
         part {
            name: "face";
            type: RECT;
            description {
               state: "default" 0.0;
               color: 120 120 120 255; /* gray */
            }
         }
      }
   }

   group {
      name: "top";
      parts {
         part {
            name: "face";
            type: RECT;
            description {
               state: "default" 0.0;
               color: 255 0 255 255; /* purple */
            }
         }
      }
   }

   group {
      name: "bottom";
      parts {
         part {
            name: "face";
            type: RECT;
            description {
               state: "default" 0.0;
               color: 0 255 255 255; /* yellow */
            }
         }
      }
   }

   group {
      name: "example_group";

      physics {
         world {
            gravity: 0 80 0;
            rate: 30;
            z: -100;
            depth: 200;
         }
      }

      script {
         public message(Msg_Type:type, id, ...) {
            if ((id == ID_IMPULSE) && (type == MSG_FLOAT_SET)) {
               new Float:x, Float:y, Float:z;
               new n = numargs();
               if (n < 5) return;
               x = getfarg(2);
               y = getfarg(3);
               z = getfarg(4);
               physics_impulse(PART:"red_box", x, y, z);
            }
            else if ((id == ID_TORQUE_IMPULSE) && (type == MSG_FLOAT_SET)) {
               new Float:x, Float:y, Float:z;
               new n = numargs();
               if (n < 5) return;
               x = getfarg(2);
               y = getfarg(3);
               z = getfarg(4);
               physics_torque_impulse(PART:"red_box", x, y, z);
            }
         }
      }

      parts {
         part {
            name: "background";
            type: RECT;
            physics_body: NONE;
            description {
               state: "default" 0.0;
               color: 255 255 255 255; /* white */
               rel1.relative: 0.0 0.0;
               rel2.relative: 1.0 1.0;
            }
         }

         part {
            name: "red_box";
            type: RECT;
            physics_body: RIGID_BOX;
            description {
               state: "default" 0.0;
               color: 255 0 0 255; /* light red */
               rel1.relative: 0.4 0.1;
               rel2.relative: 0.55 0.3;
               aspect: 1 1;
               physics {
                  mass: 30;
                  z: -24;
                  depth: 48;
                  restitution: 0.85;
                  movement_freedom {
                     linear: 1 1 1;
                     angular: 1 1 1;
                  }
                  faces {
                     face {
                        type: BOX_FRONT;
                        source: "front";
                     }
                     face {
                        type: BOX_BACK;
                        source: "back";
                     }
                     face {
                        type: BOX_TOP;
                        source: "top";
                     }
                     face {
                        type: BOX_BOTTOM;
                        source: "bottom";
                     }
                     face {
                        type: BOX_LEFT;
                        source: "left";
                     }
                     face {
                        type: BOX_RIGHT;
                        source: "right";
                     }
                  }
               }
            }
         }

         part {
            name: "floor";
            type: RECT;
            physics_body: BOUNDARY_BOTTOM;
            description {
               state: "default" 0.0;
               visible: 0;
               physics {
                  restitution: 0.8;
               }
            }
         }

         part {
            name: "front";
            type: RECT;
            physics_body: BOUNDARY_FRONT;
            description {
               state: "default" 0.0;
               visible: 0;
               physics {
                  restitution: 0.4;
               }
            }
         }

         part {
            name: "back";
            type: RECT;
            physics_body: BOUNDARY_BACK;
            description {
               state: "default" 0.0;
               visible: 0;
               physics {
                  restitution: 0.4;
               }
            }
         }

         part {
            name: "left";
            type: RECT;
            physics_body: BOUNDARY_LEFT;
            description {
               state: "default" 0.0;
               visible: 0;
               physics {
                  restitution: 0.4;
               }
            }
         }

         part {
            name: "right";
            type: RECT;
            physics_body: BOUNDARY_RIGHT;
            description {
               state: "default" 0.0;
               visible: 0;
               physics {
                  restitution: 0.4;
               }
            }
         }
      }

   }
}
